#pragma once
#include <string>
#include <jsoncpp/json/json.h>

namespace server{

//服务器向客户端提供的接口api
struct Data{
  std::string name;//用户昵称
  std::string school;//用户的学校
  std::string msg;//发送的消息内容
  //在当前情况下，cmd要么为空字符串，要么为quit
  //当为quit时表示客户端要退出
  std::string cmd;//控制上下线

  //序列化
  void serialize(std::string* output)
  {
    ////第一种方式(手动构造字符串)
    //char buf[1024*5]={0};
    //sprintf(buf,"{name:%s,school:%s,msg:%s,cmd:%s}",name.c_str(),school.c_str(),msg.c_str(),cmd.c_str());
    //*output=buf;

    //第二种方式（使用json来进行序列化）
    //可以把json::Value近似理解成一个unordered_map用来保存数据
    Json::Value value;
    value["name"]=name;
    value["school"]=school;
    value["msg"]=msg;
    value["cmd"]=cmd;
    //Json::FastWriter帮助进行序列化
    Json::FastWriter writer;
    //Writer.writer()将序列化后的字符串写到缓冲区中
    *output=writer.write(value);
    return;
  }
  void Unserialize(const std::string& input)
  {
    Json::Value value;
    Json::Reader reader;
    //将input中的内容进行反序列化放到value中
    reader.parse(input,value);

    //为了使代码更严谨，可以使用IsString()/IsInt()来判定json对象中存的数据是否符合要求
    //asString()将其转成string类型
    name=value["name"].asString();
    school=value["school"].asString();
    msg=value["msg"].asString();
    cmd=value["cmd"].asString();
    return;
  }
};
}//end server
